home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Handle more *)
- (* *)
- (* Copyright 1990, 1992 by H. Roy Engehausen. All rights reserved. *)
- (* *)
- (*===========================================================================*)
-
- UNIT BBMORE;
-
- INTERFACE
-
- PROCEDURE more_clear;
- FUNCTION more_prompt : BOOLEAN;
- FUNCTION more_check : BOOLEAN;
- PROCEDURE more_add_lines (lines_out: BYTE);
- FUNCTION more_check_lines (lines_out: BYTE) : BOOLEAN;
- PROCEDURE more_add_str (VAR in_str : STRING);
- FUNCTION more_check_str (VAR in_str : STRING) : BOOLEAN;
-
- IMPLEMENTATION
-
- USES
- DOS,
- bbdummy,
- bbmdata,
- bbmess,
- bbrdata,
- bbstr,
- bbtrace;
-
- {$UNDEF DEBUG1}
-
- (*===========================================================================*)
- (* Clear more counters *)
- (*===========================================================================*)
-
- PROCEDURE more_clear;
- BEGIN
-
- active_tcb^.out_char := 0;
- active_tcb^.out_line := 0;
-
- END;
-
- FUNCTION more_prompt : BOOLEAN;
-
- VAR
- in_str : str2;
-
- BEGIN;
-
- send_message(message_more_prompt);
-
- in_str := read_tnc_data_str;
-
- strip_crlf(in_str);
-
- send_message(message_more_done);
-
- IF LENGTH(in_str) > 0 THEN
- BEGIN
- send_message(message_op_halted);
- more_prompt := TRUE;
- END
- ELSE
- more_prompt := FALSE;
-
- END;
-
- (*===========================================================================*)
- (* Do the actual check *)
- (*===========================================================================*)
-
- FUNCTION more_check : BOOLEAN;
-
- BEGIN;
-
- more_check := FALSE;
-
- WITH active_tcb^ DO
- BEGIN;
-
- {$IFDEF DEBUG1}
- STR(uid_data.user_scr_len, in_str);
- trace_data('MRC', out_line, NIL, in_str);
- {$ENDIF}
-
- IF (uid_data.user_scr_len = 0)
- OR (out_line < uid_data.user_scr_len) THEN
- EXIT;
-
- out_char := 0;
- out_line := 0;
-
- END;
-
- more_check := more_prompt;
-
- END;
-
- (*===========================================================================*)
- (* Handle the MORE function. *)
- (*===========================================================================*)
-
- PROCEDURE more_add_lines(lines_out: BYTE);
-
- VAR
- i : INTEGER;
-
- BEGIN;
-
- WITH active_tcb^ DO
- BEGIN;
-
- IF (uid_data.user_scr_len = 0) AND NOT out_force THEN
- EXIT;
-
- i := out_line + lines_out;
-
- IF i > 255 THEN
- out_line := 255
- ELSE
- out_line := i;
-
- END;
-
- END;
-
- (*===========================================================================*)
- (* Handle the MORE function. *)
- (*===========================================================================*)
-
- FUNCTION more_check_lines(lines_out: BYTE) : BOOLEAN;
-
- BEGIN;
-
- more_add_lines(lines_out);
-
- more_check_lines := more_check;
-
- END;
-
- (*===========================================================================*)
- (* Handle the MORE function. in_str is a variable to save stack space *)
- (*===========================================================================*)
-
- PROCEDURE more_add_str(VAR in_str : STRING);
-
- VAR
- count_chars : BOOLEAN;
- i : BYTE;
- char_cnt : WORD;
- line_cnt : BYTE;
-
- BEGIN;
-
- WITH active_tcb^ DO
- BEGIN;
-
- IF (uid_data.user_scr_len = 0) AND NOT out_force THEN
- EXIT;
-
- count_chars := uid_data.user_scr_wid <> 0;
-
- char_cnt := out_char;
- line_cnt := 0;
-
- {$IFDEF DEBUG1}
- trace_data('MRX', char_cnt, NIL, '');
- {$ENDIF}
-
- FOR i := 1 TO LENGTH(in_str) DO
- BEGIN;
-
- INC(char_cnt);
-
- IF (count_chars AND (char_cnt >= uid_data.user_scr_wid))
- OR (in_str[i] = cr) THEN
- BEGIN;
-
- {$IFDEF DEBUG1}
- trace_data('MRY', ORD(in_str[i]), NIL, '');
- trace_data('MRZ', char_cnt, NIL, '');
- {$ENDIF}
-
- INC(line_cnt);
- char_cnt := 0;
- END;
-
- END;
-
- IF count_chars THEN
- out_char := char_cnt;
-
- more_add_lines(line_cnt);
-
- {$IFDEF DEBUG1}
- trace_data('MRA', line_cnt, NIL, '');
- trace_data('MRB', out_line, NIL, '');
- {$ENDIF}
-
- END;
-
- END;
-
- (*===========================================================================*)
- (* Handle the MORE function. in_str is a variable to save stack space *)
- (*===========================================================================*)
-
- FUNCTION more_check_str(VAR in_str : STRING) : BOOLEAN;
-
- BEGIN;
-
- more_add_str(in_str);
-
- more_check_str := more_check;
-
- END;
-
- END.